#include <iostream>
#include <unistd.h>
#include <signal.h>

using namespace std;

static void Usage(const string &proc)
{
    cout << "\nUsage:"
         << proc << "pid signo\n"
         << endl;
}

int cnt = 0;

void catchSig(int signo)
{
    cout << "cnt: " << cnt << endl;
    exit(1);
}

int main()
{
    while (true)
    {
        std::cout << "我在运行中...." << std::endl;
        sleep(1);
        int *p = nullptr;
        p = nullptr; // 1
        // OS怎么知道呢？？我野指针了呢？
        *p = 100; // 为什么 野指针 就会崩溃呢？因为OS会给当前进程发送指定的11号信号
    }
    // signal(SIGALRM, catchSig);

    // alarm(1);
    // while (true)
    // {
    //     cnt++;
    // }
    // return 0;
}

// ./mysignal pid signo
// int main(int argc, char *argv[])
// {
//      signal(SIGALRM, catchSig);
//     alarm(1);

//     while(true)
//     {
//         cout << "我在运行: " << getpid() <<endl;
//     }
// signal(SIGFPE, catchSig);
// signal(11, catchSig);
// while (true)
// {
//     std::cout << "我在运行中...." << std::endl;
//     sleep(1);
//     int *p = nullptr;
//     p = nullptr; // 1
//      OS怎么知道呢？？我野指针了呢？
//     *p = 100; // 为什么 野指针 就会崩溃呢？因为OS会给当前进程发送指定的11号信号
// }
// int a = 10;
// a /= 0;
//  3. 产生信号的方式：硬件异常产生信号
// while (true)
// {
//     std::cout << "我在运行中...." << std::endl;
//     sleep(1);
// }
//  2. 系统调用向目标进程发送信号
// int cnt = 0;
// while (cnt <= 10)
// {
//     cout << "cnt:" << cnt++ << " pid:" << getpid() << endl;
//     sleep(1);
//     if (cnt >= 5)
//     {
//          raise(9);// kill(getpid(), signo)
//         abort(); // kill(getpid(), signo)
//     }
// }
// if (argc != 3)
// {
//     Usage(argv[0]);
//     exit(1);
// }

// pid_t pid = atoi(argv[1]);
// int signo = atoi(argv[2]);

// int n = kill(pid, signo);
// if (n != 0)
// {
//     perror("kill");
// }
//  1. 通过键盘发送信号
// while (true)
// {
//     cout << "hello world" << endl;
//     sleep(1);
// }
// return 0;
// }
